﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

    class Strumien
    {
        public string nazwa; // nazwa strumienia
        int priorytet; // priorytet strumienia (do którego bufora trafi)
        private double lambda_rozmiar, lambda_czas; // parametr rozkładu prawdopodobieństba
        public SredniCzas sredni_czas_obslugi_paczki = new SredniCzas();
        ListaNieuporzadkowana<Zdarzenie> fifo;
        private int id;//id strumienia


    public Strumien(ref ListaNieuporzadkowana<Zdarzenie> fifo, string nazw, int priorytet, double lambda_rozmiar, double lambda_czas, int id_strumienia) // KONSTRUKTOR id_strumienia - id tego strumienia
      {
            this.id = id_strumienia;
            this.fifo = fifo;
            this.nazwa = nazw;
            this.priorytet = priorytet;
            this.lambda_rozmiar = lambda_rozmiar;
            this.lambda_czas = lambda_czas;

        }



    public void WstawPakiet(double obecny_czas) // DODAWANIE PACZKI
        {
            int rozmiar = GetRandSize();
            Pakiet p = new Pakiet(rozmiar, priorytet);
            // Console.WriteLine("pack size: {0}", p.size);
            double t = GetRandTime();
            // Console.WriteLine("time: {0}", t+current_time);
            Zdarzenie e = new Zdarzenie(t + obecny_czas, true, ref p);
            fifo.Wstaw(e);
        }

        public double GetRandTime() // POBIERANIE CZASU WEDŁUG ROZKŁADU WYKŁADNICZEGO
        {//y=1-e.^(-lambda*t) => -lambda*t=ln(1-y) => t = -ln(1-y)/lambda
            Random r = new Random();
            double y = r.NextDouble(); // get rand 0 to 1 
            return -Math.Log(1 - y) / lambda_czas; // wg. t = -ln(1-y)/lambda
        }

        public int GetRandSize() // POBIERANIE CZASU WEDŁUG ROZKŁADU WYKŁADNICZEGO
        {//y=1-e.^(-lambda*t) => -lambda*t=ln(1-y) => t = -ln(1-y)/lambda
            Random r = new Random();
            double y = r.NextDouble(); // get rand 0 to 1 
            return 1 + (int)Math.Ceiling(-Math.Log(1 - y) / lambda_rozmiar); // wg. t = -ln(1-y)/lambda
        }
    }

